So in diesem Abschnitt möchte ich jetzt nur sehr kurz auf den C-Präprozessor eingehen,
auf zwei wichtige Elemente, die einem der C-Präprozessor zur Verfügung stellt.
Dieser Präprozessor ist in Zusammenhang mit der Programmiersprache C durchaus eine Besonderheit
und seine Entwicklung muss man sicherlich ein Stück weit vor dem historischen Hintergrund auch
von C sehen. So vor 50 Jahren, als die Programmiersprache C so um 1970 rum entwickelt
wurde, war natürlich die Leistungsfähigkeit der Rechner und damit auch die Möglichkeit,
was man alles in einem Compiler machen konnte, durchaus eingeschränkt. Und mit diesem Problem
ist man so umgegangen, dass man Compiler einfach in mehrere Phasen zerlegt hat,
in mehrere sogenannte Pässe und so hat der Compiler dann eben Schritt für Schritt aus so einem
Programm-Quellcode dann das ausführbare Programm erzeugt. Und letztendlich ist dieser C-Präprozessor
nichts anderes wie so ein vorgelageter, eine vorgelagerte Phase des Compilers, in der die
C-Quelldatei einfach mal so ein Stück vorverarbeitet wird. Es werden zum Beispiel die Kommentare
rausgeworfen. Man kann Inhalte anderer Dateien einfügen oder man kann auch einfach so Passagen
beschreiben, die nur abhängig von irgendeiner Voreinstellung übersetzt werden sollen, weil sie
zum Beispiel speziellen Code enthalten, der abhängig von einem bestimmten Prozessortyp ist
oder von einer bestimmten Betriebssystemversion. Und auf die Weise kann man dann eben einstellen,
was jetzt wirklich bei einer konkreten Übersetzung am Ende an Programm-Code wirklich genommen wird
und was übersetzt wird und was vielleicht auch weggelassen wird. Und man kann damit letztendlich
so eine Art Konstanten definieren. In der Anfangsphase hatte C keine Konstanten, das was wir im
Kapitel über Variablen und Datentypen kennengelernt haben, diese Definition auch von Konstanten. Das
gab es in der ursprünglichen C-Version um 1970 noch nicht. Und wenn man jetzt in dem Programm
irgendwelche Werte hat, zum Beispiel die Größe von irgendeinem Eingabepuffer oder sowas, wo man
sagen möchte, der soll 1024 Zeilen groß sein und dann hat man eine Schleife, die über diesen Puffer
läuft und die muss natürlich dann von 0 bis 1023 laufen. Und man hat vielleicht auch ein paar
andere Stellen, wo man diese Puffergröße braucht. Dann ist es natürlich gut, wenn man diese Puffergröße
an einer Stelle hinschreiben kann und an allen Stellen, wo diese Puffergröße dann benötigt wird,
kann man also dann die so vordefinierte Konstante einfach einsetzen. Und wenn man dann was dran
ändern möchte, hat man eine Stelle, an der man das ändert. Und auch dafür hat eben dieser
Präprozessor Mechanismen. Der Präprozessor ist eigentlich völlig unabhängig vom Rest der
Programmiersprache C und Anweisungen an den Präprozessor werden dadurch gekennzeichnet,
dass man am Anfang der Zeile so ein Garten-Sound-Zeichen, also ein Hash-Symbol setzt.
Dann weiß eben der Präprozessor, dass diese Zeile für ihn ist und er bearbeitet sie und der
C-Compiler, der dann hinterher das Ergebnis dieser Vorverarbeitung bekommt, der sieht diese Zeilen
dann gar nicht mehr, weil der Präprozessor die in dem Zusammenhang dann auch gleich rausmacht.
Die Syntax ist unabhängig vom Rest der Sprache. Es gibt, wir werden das jetzt im Moment noch nicht
betrachten, aber im Rahmen der Übungen kommt das dann irgendwann auch mit dran. Es gibt
darin im Präprozessor auch IF-Anweisungen zum Beispiel, wo man abhängig von irgendeinem Wert
dann irgendwelche Zeilen an den Compiler übergibt oder eben nicht. Aber auch diese Syntax-Fundos,
so eine IF-Anweisung für Präprozessor ist also völlig anders wie ein IF in der Programmiersprache
C. Das ist also eigentlich eine eigene Programmiersprache im Kontext von C-Programmen.
Insbesondere werden auch die Präprozessor-Anweisungen nicht durch ein Semikolon abgeschlossen.
Wir schauen uns jetzt einfach mal zwei wichtige Funktionen an. Das erste ist die Definition von
Macros, das ist das Define und das andere ist das Einfügen von Dateien in eine Datei. Das ist das
Include. Macros ermöglichen einfache textuelle Ersetzungen. Also ist im Prinzip so ein bisschen
was ähnliches wie Konstante, aber ist es mehr, weil man kann das also nicht nur für Werte machen,
sondern man kann das auch für irgendwelche Programmpassagen machen. Also es ist letztendlich
einfach eine textuelle Ersetzung. Und so ein Macro wird durch diese Define-Anweisung definiert
und die Syntax ist am Ende dann einfach so, ich schreibe hier ein Define, dann den Namen eines
Macros und ein Ersatztext. Und diese Makro-Definition bewirkt letztendlich nichts anderes,
als dass der Präprozessor im nachfolgenden Text, der C-Quelle, alle Vorkommen dieses
Presenters
Zugänglich über
Offener Zugang
Dauer
00:09:54 Min
Aufnahmedatum
2020-04-25
Hochgeladen am
2020-04-25 13:16:11
Sprache
de-DE